package entidades;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;

/**
 * The persistent class for the usuario database table.
 */
@Entity
@NamedQueries( { @NamedQuery(name = "login", query = "Select u From Usuario u Where u.nome = :nome and u.senha = :senha"),
				 @NamedQuery(name = "buscar", query = "Select u From Usuario u Where u.nome like :busca" ) } )
public class Usuario implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "id_usuario", sequenceName = "id_usuario", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_usuario")
	private Integer id;

	private Timestamp data;

	private String nome;

	private String senha;

	@Transient
	private String confSenha;

	private String sexo;

	// bi-directional many-to-one association to Seguidor
	@OneToMany(mappedBy = "usuario1")
	private List<Seguidor> seguidors1;

	// bi-directional many-to-one association to Seguidor
	@OneToMany(mappedBy = "usuario2")
	private List<Seguidor> seguidors2;

	// bi-directional many-to-one association to Tweet
	@OneToMany(mappedBy = "usuario")
	private List<Tweet> tweets;

	@Transient
	private boolean editavel;

	public Usuario() {
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Timestamp getData() {
		return this.data;
	}

	public void setData(Timestamp data) {
		this.data = data;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getConfSenha() {
		return this.confSenha;
	}

	public void setConfSenha(String confSenha) {
		this.confSenha = confSenha;
	}

	public String getSexo() {
		return this.sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public List<Seguidor> getSeguidors1() {
		return this.seguidors1;
	}

	public void setSeguidors1(List<Seguidor> seguidors1) {
		this.seguidors1 = seguidors1;
	}

	public List<Seguidor> getSeguidors2() {
		return this.seguidors2;
	}

	public void setSeguidors2(List<Seguidor> seguidors2) {
		this.seguidors2 = seguidors2;
	}

	public List<Tweet> getTodosTweets() {
		List<Tweet> todosTweets = new ArrayList<Tweet>(0);
		todosTweets.addAll(tweets);
		
		for (Seguidor seguidor : seguidors1) {
			todosTweets.addAll(seguidor.getUsuario2().getTweets());
		}
		
		Collections.sort(todosTweets, new Comparator<Tweet>() {
		    public int compare(Tweet t1, Tweet t2) {
		    	
		    	if (t1.getData() == null || t2.getData() == null ) {
		    		return 0;
		    	}
		    	
		        return t2.getData().compareTo(t1.getData());
		    }
		} );
		
		return todosTweets;
	}
	
	public List<Tweet> getTweets() {
		return this.tweets;
	}
	
	public void setTweets(List<Tweet> tweets) {
		this.tweets = tweets;
	}

	public boolean isEditavel() {
		return editavel;
	}

	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}

	@Override
	public boolean equals(Object obj) {

		if (obj instanceof Usuario) {
			Usuario u = (Usuario)obj;
			return u.getId().equals(id);
		}
		
		return super.equals(obj);
	}
}
